#ifndef _SG_CHART_H_
#define _SG_CHART_H_

#include "sg_obj.h"
#include "..\lcd_drivers\lcd.h"
#include "typedef.h"



typedef enum _sg_act
{
    SG_ACT_PLUS,        // 加1
    SG_ACT_MINUS,       // 减1
    SG_ACT_LEFT,        // 左移
    SG_ACT_RIGHT        // 右移
}sg_act_t;

typedef struct _sg_wave_t
{
    lcd_color_t Color;
    sg_coord_t *PointCoord; // 每个点的坐标
    u16 *PointValue;        // 每个点的值
}sg_wave_t;

typedef struct _sg_chart
{
    // ------------------------ sg_obj 内容 ------------------------
    sg_coord_t Pos;         // 左上角坐标
    u16 Width;              // 宽度
    u16 Height;             // 高度
    lcd_color_t BgColor;    // 背景色
    sg_st_t Status;         // 状态
    // -------------------------------------------------------------

    u16 Border;             // 边框（四周无效的区域）
    u8 PointSize;           // 点的尺寸
    u8 CurSize;             // 光标的尺寸
    lcd_color_t GridColor;  // 格子线色
    
    u16 MaxValue;           // 最大值
    u8 WaveNum;             // 曲线（波形）数量
    u8 ActiveWaveNum;       // 活动的曲线(编号)（光标在哪个曲线）
    u16 PointNum;           // 点的数量
    u16 Cur;             // 光标在哪个点

    sg_wave_t *Wave[4];     // 曲线列表，最大4个曲线
}sg_chart_t;

/**
 * 创建一个Chart，默认10个点，最大值100，点的尺寸4，光标尺寸7。将会默认添加一条曲线。
 * 注意，创建完毕后需要调用 SgChart_refreshAll 显示出来。
*/
sg_chart_t *SgChart_new();

/**
 * 创建一个波形曲线并将之添加到Chart进行显示。
 * @param obj sg_chart_t 对象
 * @param wave_color 曲线颜色
 * @return 曲线对象指针，其也会被保存在 sg_chart_t 的 Wave 列表中。
*/
sg_wave_t *SgChart_newWave(sg_chart_t *obj, lcd_color_t wave_color);

/**
 * 删除 Chart 中最后添加的那个曲线（列表中最后一个）
 * @param obj sg_chart_t 对象
*/
void SgChart_DeleteLastWave(sg_chart_t *obj);

/**
 * 删除一个Chart释放内存，屏幕显示未做清除处理。所有添加的曲线也会一并被删除。
*/
void SgChart_delete(sg_chart_t *obj);

/**
 * 将一个曲线设置为活动曲线，光标将落在该曲线上。
 * @param wave_num 要设置的曲线编号，按照添加顺序，从0开始，注意创建Chart时已经创建了0号曲线。
*/
void SgChart_setActiveWave(sg_chart_t *obj, u8 wave_num);

/**
 * 让Chart执行动作并立即刷新，动作可以是 SG_ACT_PLUS,SG_ACT_MINUS,SG_ACT_LEFT,SG_ACT_RIGHT，对应光标的移动。
*/
void SgChart_exeAction(sg_chart_t *obj, sg_act_t act);

// 设置当前光标所在点的值并立即刷新
void SgChart_setCurValue(sg_chart_t *obj, u16 value);

/**
 * 设置光标在活动曲线上的位置并立即刷新
 * @param obj sg_chart_t 对象
 * @param point_id 点的编号，最左侧为0.
*/
void SgChart_setCur(sg_chart_t *obj, u16 point_id);

// 刷新整个Chart
void SgChart_refreshAll(sg_chart_t *obj);


// 以下是过时的API

// 设置Chart的位置坐标（左上角）,设置完成后需要 SgChart_refreshAll。
void SgChart_setPosition(sg_chart_t *obj, sg_coord_t pos);

/**
 * 设置 Chart 宽度。设置完成后需要 SgChart_refreshAll。
*/
void SgChart_setWidth(sg_chart_t *obj, u16 width);

// 设置 Chart 高度。设置完成后需要 SgChart_refreshAll。
void SgChart_setHeight(sg_chart_t *obj, u16 height);

// get方法不写了，直接访问值吧。

#endif
